package com.huiying.entity.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @Author: lsh
 * @Date: 2024/10/24/23:09
 * @Description: 消息
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Message implements Serializable {

    private static final long serialVersionUID = 1L;

    // --- 核心消息标识符 ---
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id; // 每条消息的唯一ID（数据库主键）
    private Long conversationId; // 1对1会话的唯一ID（发送方和接收方共享）

    // --- 消息内容与类型 ---
    private String content; // 文本消息内容
    private MessageType type; // 消息类型的枚举（TEXT, IMAGE, VOICE 等）
    private String imageUrl; // 如果类型是 IMAGE，则为图片URL
    // private String voiceUrl; // 考虑用于语音消息
    // private String videoUrl; // 考虑用于视频消息

    // --- 发送方和接收方信息 ---
    @JsonSerialize(using = ToStringSerializer.class)
    private Long senderId; // 发送消息的用户ID
    @JsonSerialize(using = ToStringSerializer.class)
    private Long receiverId; // 消息的预期接收者用户ID

    // --- 消息状态 ---
    private MessageStatus status; // 消息状态的枚举（SENT, DELIVERED, READ, FAILED）

    // --- 删除标志（软删除） ---
    private boolean senderDeleted; // 如果发送方已从其视图中删除消息，则为 true
    private boolean receiverDeleted; // 如果接收方已从其视图中删除消息，则为 true

    // --- 时间戳 ---
    private LocalDateTime createdTime; // 消息发送时间（创建时间）
    // private LocalDateTime deliveredTime; // 可选：消息送达时间
    // private LocalDateTime readTime; // 可选：消息已读时间
    @TableField(exist = false)
    private String senderUsername; // 发送者昵称

    @TableField(exist = false)
    private String senderAvatar; // 发送者头像URL

    // --- 枚举，提高类型安全性和清晰度 ---

    // 定义消息类型（例如，文本、图片、语音）
    public enum MessageType {
        TEXT,
        IMAGE,
        VOICE,
        VIDEO,
        // 根据需要添加其他类型，例如 SYSTEM（用于系统通知）
         JOIN, LEAVE // 如果你在 ChatController 中使用这些类型（如我之前的示例）
    }

    // 定义消息状态（例如，已发送、已送达、已读）
    public enum MessageStatus {
        SENT,      // 消息从发送方发送到服务器
        DELIVERED, // 消息从服务器发送到接收方的设备
        READ,      // 消息已被接收方阅读
        FAILED     // 消息发送/送达失败
    }
}